const SIGN_REGEXP = /([yMdhsm])(\1*)/g;
const DEFAULT_PATTERN = 'yyyy-MM-dd';
const util = {
  getQueryStringByName: function (name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    var r = window.location.search.substr(1).match(reg);
    var context = "";
    if (r != null)
      context = r[2];
    reg = null;
    r = null;
    return context == null || context == "" || context == "undefined" ? "" : context;
  },
  formatDate: {
    format: function (date, fmt) {
      var o = {
        "M+": date.getMonth() + 1, //月份
        "d+": date.getDate(), //日
        "h+": date.getHours(), //小时
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
        "S": date.getMilliseconds() //毫秒
      };
      if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
      for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
      return fmt;
    },
    parse: function (dateString, pattern) {
      var matchs1 = pattern.match(SIGN_REGEXP);
      var matchs2 = dateString.match(/(\d)+/g);
      if (matchs1.length == matchs2.length) {
        var _date = new Date(1970, 0, 1);
        for (var i = 0; i < matchs1.length; i++) {
          var _int = parseInt(matchs2[i]);
          var sign = matchs1[i];
          switch (sign.charAt(0)) {
            case 'y':
              _date.setFullYear(_int);
              break;
            case 'M':
              _date.setMonth(_int - 1);
              break;
            case 'd':
              _date.setDate(_int);
              break;
            case 'h':
              _date.setHours(_int);
              break;
            case 'm':
              _date.setMinutes(_int);
              break;
            case 's':
              _date.setSeconds(_int);
              break;
          }
        }
        return _date;
      }
      return null;
    }
  },
  cookie: {
    getCookie: function (name) {
      var regexp = new RegExp("(?:^" + name + "|;\\s*" + name + ")=(.*?)(?:;|$)", "g");
      var result = regexp.exec(document.cookie);
      return (result === null) ? null : decodeURIComponent(result[1]);
    },
    setCookie: function (name, value, expires, path, domain) {
      var cookie = name + '=' + escape(value) + ';';
      if (expires) {
        if (expires instanceof Date) {
          cookie += 'expires=' + expires.toGMTString() + ';';
        }
      }
      path = path ? path : '/';
      cookie += 'path=' + path + ';';
      if (domain) {
        cookie += 'domain=' + domain + ';';
      }
      document.cookie = cookie;
    },
    delCookie: function (name, path, domain, secure) {
      if (this.getCookie(name)) {
        var expires = new Date();
        expires.setTime(expires.getTime() + -10 * 1000);
        domain = domain ? domain : '';
        path = path ? path : '/';
        var newCookie = escape(name) + '=' + escape('') + (expires ? '; expires=' + expires.toGMTString() : '') + '; path=' + path + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '');
        document.cookie = newCookie;
      }
    }
  },
  xlsx: {
    getGridDataToJson: function () {
      var headData = document.querySelectorAll(".el-table__header-wrapper table thead tr th .cell");
      var contentData = document.querySelectorAll(".el-table__body-wrapper table tbody tr");

      var AllJsonData = [];
      var header = {};
      for (var i = 0, j = headData.length; i < j; i++) {
        var parse = headData[i].textContent;
        header[parse] = parse;
      }
      AllJsonData.push(header);
      for (var i = 0, j = contentData.length; i < j; i++) {
        var cellData = contentData[i].querySelectorAll(".cell");
        var cellObj = {};
        for (var m = 0, n = cellData.length; m < n; m++) {
          var parse = headData[m].textContent;
          cellObj[parse] = cellData[m].textContent;
        }
        AllJsonData.push(cellObj);
      }
      return AllJsonData;
    },
    downloadExl: function (json, XLSX, name) {
      document.querySelector("body").insertAdjacentHTML("beforeend", '<a href="" download="' + name + '.xlsx" id="hf"></a>');

      var type = "xlsx";
      var tmpDown; //导出的二进制对象
      var keyMap = []; //获取键
      for (var k in json[0]) {
        keyMap.push(k);
      }
      var tmpdata = []; //用来保存转换好的json
      json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
        v: v[k],
        position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
      }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
        v: v.v
      });
      var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10
      var tmpWB = {
        SheetNames: ['mySheet'], //保存的表标题
        Sheets: {
          'mySheet': Object.assign({},
            tmpdata, //内容
            {
              '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
            })
        }
      };
      tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB, {
          bookType: (type == undefined ? 'xlsx' : type),
          bookSST: false,
          type: 'binary'
        } //这里的数据是用来定义导出的格式类型
      ))], {
        type: ""
      }); //创建二进制对象写入转换好的字节流
      var href = URL.createObjectURL(tmpDown); //创建对象超链接
      document.getElementById("hf").href = href; //绑定a标签
      document.getElementById("hf").click(); //模拟点击实现下载
      setTimeout(function () { //延时释放
        URL.revokeObjectURL(tmpDown); //用URL.revokeObjectURL()来释放这个object URL
      }, 100);
    },
    s2ab: function (s) { //字符串转字符流
      var buf = new ArrayBuffer(s.length);
      var view = new Uint8Array(buf);
      for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
      return buf;
    },
    // 将指定的自然数转换为26进制表示。映射关系：[0-25] -> [A-Z]。
    getCharCol: function (n) {
      let temCol = '',
        s = '',
        m = 0
      while (n > 0) {
        m = n % 26 + 1
        s = String.fromCharCode(m + 64) + s
        n = (n - m) / 26
      }
      return s
    }
  },
  extend: function (target, source, flag) {

    for (var key in source) {
      if (source.hasOwnProperty(key))
        flag ?
        (target[key] = source[key]) :
        (target[key] === void 0 && (target[key] = source[key]));
    }
    return target;
  },
  mergeArrays: function (keys, arrs, link) {
    let obj = {};
    let ret = [];
    
    keys.forEach(o => {
      obj[o.key] = null;
    })
    let mainArray = arrs[0];
    if (arrs.length == 1) {
      ret = mainArray;
    } else {
      mainArray.forEach(item => {
        let v = item[link];
        item.linked = false;
        if (v !== undefined) {
          for (let index = 1; index < arrs.length; index++) {
            const eleArray = arrs[index];
            for (let j = 0; j < eleArray.length; j++) {
              const a = eleArray[j];
              if (a[link] === v) {
                item = Object.assign(item, a);
                item.linked = true;
                break;
              }
            }
          }
          if (item.linked) {
            ret.push(item);
          }
        }
      })
    }

    return ret;
  },
  findArrayByProperty: function (item, array, property) {
    let index = -1;
    if (array.length == 0) {
      index = -1;
    } else if (property && item instanceof Object && array.length > 0) {
      for (let i = 0; i < array.length; i++) {
        const element = array[i];
        if (element[property] == item[property]) {
          index = i;
          break;
        }
      }
    } else {
      for (let i = 0; i < array.length; i++) {
        const element = array[i];
        if (element == item) {
          index = i;
          break;
        }
      }
    }
    return index;
  }
};
module.exports = util